package net.ksic.common;

import java.util.regex.Pattern;

/** 문자열의 형식을 검사하는 기능을 갖는 클래스 */
public class PatternChecker {
	
	private static PatternChecker current = null;
	
	public static PatternChecker getInstance() {
		if (current == null) {
			current = new PatternChecker();
		}
		return current;
	}
	
	public static void freeInstance() {
		if (current != null) {
			current = null;
		}
	}
	
	/** null 혹은 공백을 검사한다. */
	public boolean isValue(String str) {
		boolean result = false;
		
		if (str != null) {
			if (!str.trim().equals("")) {
				result = true;
			}
		}
		return result;
	}

	/** 숫자 모양에 대한 형식 검사 */
	public boolean isNum(String str) {
		return Pattern.matches("^[0-9]*$", str);
	}

	/** 영문으로만 구성되었는지에 대한 형식 검사 */
	public boolean isEng(String str) {
		return Pattern.matches("^[a-zA-Z]*$", str);
	}

	/** 한글로만 구성되었는지에 대한 형식 검사 */
	public boolean isKor(String str) {
		return Pattern.matches("^[ㄱ-ㅎ가-?R]*$", str);
	}

	/** 영문과 숫자로만 구성되었는지에 대한 형식 검사 */
	public boolean isEngNum(String str) {
		return Pattern.matches("^[a-zA-Z0-9]*$", str);
	}

	/** 한글과 숫자로만 구성되었는지에 대한 형식 검사 */
	public boolean isKorNum(String str) {
		return Pattern.matches("^[ㄱ-ㅎ가-?R0-9]*$", str);
	}

	/** 이메일 형식인지에 대한 검사 
	 * --> "아이디@도메인"의 형식을 충족해야 한다. */
	public boolean isEmail(String str) {
		return Pattern.matches(
				"[0-9a-zA-Z]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$", str);
				
	}

	/** "-"없이 핸드폰번호인지에 대한 형식검사.
	 * 반드시 앞자리가 010,010,016~9사이를 충족해야 하며,
	 * 각 부분에 대한 자리수도 충족시켜야 한다.  */
	public boolean isCellPhone(String str) {
		return Pattern.matches("^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$",
				str);
	}

	/** "-"없이 전화번호인지에 대한 형식검사.
	 * 각 부분에 대한 자리수도 충족시켜야 한다. */
	public boolean isTel(String str) {
		return Pattern.matches("^\\d{2,3}\\d{3,4}\\d{4}$", str);
	}

	/** "-"없이 주민번호에 대한 글자수 및 
	 * 뒷자리 첫글자가 1~4의 범위에 있는지에 대한 검사 */
	public boolean isJumin(String str) {
		return Pattern.matches("^\\d{6}[1-4]\\d{6}", str);
	}

	/** 아이피주소 형식에 대한 검사 */
	public boolean isIP(String str) {
		return Pattern.matches(
				"([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})",
				str);
	}
}